/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entities;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author damfercer
 */
@Entity
@Table(name = "producto", catalog = "corporate", schema = "")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Producto.findAll", query = "SELECT p FROM Producto p ORDER BY p.descripcion,p.color"),
    @NamedQuery(name = "Producto.findByIdProducto", query = "SELECT p FROM Producto p WHERE p.idProducto = :idProducto"),
    @NamedQuery(name = "Producto.findByDescripcion", query = "SELECT p FROM Producto p WHERE p.descripcion = :descripcion"),
    @NamedQuery(name = "Producto.findByNombreComercial", query = "SELECT p FROM Producto p WHERE p.nombreComercial = :nombreComercial"),
    @NamedQuery(name = "Producto.findByColor", query = "SELECT p FROM Producto p WHERE p.color = :color"),
    @NamedQuery(name = "Producto.findByPvp", query = "SELECT p FROM Producto p WHERE p.pvp = :pvp"),
    @NamedQuery(name = "Producto.findByReferenciaTela", query = "SELECT p FROM Producto p WHERE p.referenciaTela = :referenciaTela"),
    @NamedQuery(name = "Producto.findByImagenTela", query = "SELECT p FROM Producto p WHERE p.imagenTela = :imagenTela"),
    @NamedQuery(name = "Producto.findByFechaRegistro", query = "SELECT p FROM Producto p WHERE p.fechaRegistro = :fechaRegistro"),
    @NamedQuery(name = "Producto.findByUltimaModificacion", query = "SELECT p FROM Producto p WHERE p.ultimaModificacion = :ultimaModificacion"),
    @NamedQuery(name = "Producto.findByActivo", query = "SELECT p FROM Producto p WHERE p.activo = :activo"),
    @NamedQuery(name = "Producto.findByComentarios", query = "SELECT p FROM Producto p WHERE p.comentarios = :comentarios"),
    @NamedQuery(name = "Producto.findByMinimoTela", query = "SELECT p FROM Producto p WHERE p.minimoTela = :minimoTela"),
    @NamedQuery(name = "Producto.findByCosteMetroTela", query = "SELECT p FROM Producto p WHERE p.costeMetroTela = :costeMetroTela"),
    @NamedQuery(name = "Producto.findByCmt", query = "SELECT p FROM Producto p WHERE p.cmt = :cmt"),
    @NamedQuery(name = "Producto.findByImagen", query = "SELECT p FROM Producto p WHERE p.imagen = :imagen"),
    @NamedQuery(name = "Producto.findByConsumoUnitarioTela", query = "SELECT p FROM Producto p WHERE p.consumoUnitarioTela = :consumoUnitarioTela"),
    @NamedQuery(name = "Producto.findByCamposObligatiorios", query = "SELECT p FROM Producto p WHERE p.d = :d AND p.c = :c AND p.s = :s AND p.descripcion = :descripcion AND p.color = :color AND p.sexo = :sexo AND p.serieTallaje = :serieTallaje AND p.temporada = :temporada"),
    @NamedQuery(name = "Producto.findByIdTemporada", query = "SELECT p FROM Producto p WHERE p.temporada.idTemporada = :idTemporada ORDER BY p.descripcion,p.color"),
    @NamedQuery(name = "Producto.comprobarSerieTallaje", query = "SELECT p FROM Producto p WHERE p.idProducto = :idProducto aND p.serieTallaje.idSerieTallaje = :idSerieTallaje"),
    @NamedQuery(name = "Producto.findLastProduct", query = "SELECT p FROM Producto p ORDER BY p.idProducto DESC"),
    @NamedQuery(name = "Producto.findByMinimoPedido", query = "SELECT p FROM Producto p WHERE p.minimoPedido = :minimoPedido")})

@NamedNativeQueries({
    @NamedNativeQuery(name = "Producto.findByPedidoFabricaYCYSerieTallaje", query = "SELECT DISTINCT producto.* FROM producto, serie_tallaje, c, linea_pedido_fabrica, producto_talla WHERE producto.SERIE_TALLAJE=serie_tallaje.ID_SERIE_TALLAJE AND c.ID_C=producto.C AND linea_pedido_fabrica.PRODUCTO_TALLA=producto_talla.ID_PRODUCTO_TALLA AND producto_talla.PRODUCTO=producto.ID_PRODUCTO AND linea_pedido_fabrica.PEDIDO_FABRICA= ? AND c.ID_C= ? AND serie_tallaje.ID_SERIE_TALLAJE = ?" , resultClass=Producto.class),
    @NamedNativeQuery(name = "Producto.findByPedidoYCYSerieTallaje", query = "SELECT DISTINCT producto.* FROM producto, serie_tallaje, c, pedido, linea_pedido, producto_talla WHERE producto.SERIE_TALLAJE=serie_tallaje.ID_SERIE_TALLAJE AND c.ID_C=producto.C AND linea_pedido.PRODUCTO_TALLA=producto_talla.ID_PRODUCTO_TALLA AND producto_talla.PRODUCTO=producto.ID_PRODUCTO AND linea_pedido.PEDIDO= ? AND c.ID_C= ? AND serie_tallaje.ID_SERIE_TALLAJE = ?" , resultClass=Producto.class)})


public class Producto implements Serializable {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "producto")
    private List<NivelPrecioProducto> nivelPrecioProductoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "producto")
    private List<MultiplicadorProductoPedido> multiplicadorProductoPedidoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "producto")
    private List<PvpInternacional> pvpInternacionalList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "producto")
    private List<ProductoTalla> productoTallaList;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "COTIZACION")
    private BigDecimal cotizacion;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_PRODUCTO")
    private Integer idProducto;
    @Size(max = 40)
    @Column(name = "DESCRIPCION")
    private String descripcion;
    @Size(max = 60)
    @Column(name = "NOMBRE_COMERCIAL")
    private String nombreComercial;
    @Size(max = 20)
    @Column(name = "COLOR")
    private String color;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "PVP")
    private BigDecimal pvp;
    @Size(max = 40)
    @Column(name = "REFERENCIA_TELA")
    private String referenciaTela;
    @Size(max = 128)
    @Column(name = "IMAGEN_TELA")
    private String imagenTela;
    @Column(name = "FECHA_REGISTRO")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaRegistro;
    @Column(name = "ULTIMA_MODIFICACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date ultimaModificacion;
    @Column(name = "ACTIVO")
    private Boolean activo;
    @Size(max = 500)
    @Column(name = "COMENTARIOS")
    private String comentarios;
    @Size(max = 100)
    @Column(name = "MINIMO_TELA")
    private String minimoTela;
    @Column(name = "COSTE_METRO_TELA")
    private BigDecimal costeMetroTela;
    @Column(name = "CMT")
    private BigDecimal cmt;
    @Size(max = 128)
    @Column(name = "IMAGEN")
    private String imagen;
    @Column(name = "CONSUMO_UNITARIO_TELA")
    private BigDecimal consumoUnitarioTela;
    @Column(name = "MINIMO_PEDIDO")
    private Integer minimoPedido;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "producto")
    private List<HistoricoProducto> historicoProductoList;
    @JoinColumn(name = "ULTIMO_USUARIO", referencedColumnName = "ID_USUARIO")
    @ManyToOne
    private Usuario ultimoUsuario;
    @JoinColumn(name = "USUARIO_CREADOR", referencedColumnName = "ID_USUARIO")
    @ManyToOne
    private Usuario usuarioCreador;
    @JoinColumn(name = "SEXO", referencedColumnName = "ID_SEXO")
    @ManyToOne
    private Sexo sexo;
    @JoinColumn(name = "PROVEEDOR", referencedColumnName = "ID_PROVEEDOR")
    @ManyToOne
    private Proveedor proveedor;
    @JoinColumn(name = "SERIE_TALLAJE", referencedColumnName = "ID_SERIE_TALLAJE")
    @ManyToOne
    private SerieTallaje serieTallaje;
    @JoinColumn(name = "S", referencedColumnName = "ID_S")
    @ManyToOne
    private S s;
    @JoinColumn(name = "C", referencedColumnName = "ID_C")
    @ManyToOne
    private C c;
    @JoinColumn(name = "D", referencedColumnName = "ID_D")
    @ManyToOne
    private D d;
    @JoinColumn(name = "ETAPA", referencedColumnName = "ID_ETAPA_PRODUCTO")
    @ManyToOne
    private EtapaProducto etapa;
    @JoinColumn(name = "TEMPORADA", referencedColumnName = "ID_TEMPORADA")
    @ManyToOne
    private Temporada temporada;
    @JoinColumn(name = "FABRICANTE_TELA", referencedColumnName = "ID_PROVEEDOR")
    @ManyToOne
    private Proveedor fabricanteTela;

    public Producto() {
    }

    public Producto(Integer idProducto) {
        this.idProducto = idProducto;
    }

    public Integer getIdProducto() {
        return idProducto;
    }

    public void setIdProducto(Integer idProducto) {
        this.idProducto = idProducto;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public String getNombreComercial() {
        return nombreComercial;
    }

    public void setNombreComercial(String nombreComercial) {
        this.nombreComercial = nombreComercial;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public BigDecimal getPvp() {
        return pvp;
    }

    public void setPvp(BigDecimal pvp) {
        this.pvp = pvp;
    }

    public String getReferenciaTela() {
        return referenciaTela;
    }

    public void setReferenciaTela(String referenciaTela) {
        this.referenciaTela = referenciaTela;
    }

    public String getImagenTela() {
        return imagenTela;
    }

    public void setImagenTela(String imagenTela) {
        this.imagenTela = imagenTela;
    }

    public Date getFechaRegistro() {
        return fechaRegistro;
    }

    public void setFechaRegistro(Date fechaRegistro) {
        this.fechaRegistro = fechaRegistro;
    }

    public Date getUltimaModificacion() {
        return ultimaModificacion;
    }

    public void setUltimaModificacion(Date ultimaModificacion) {
        this.ultimaModificacion = ultimaModificacion;
    }

    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }

    public String getComentarios() {
        return comentarios;
    }

    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }

    public String getMinimoTela() {
        return minimoTela;
    }

    public void setMinimoTela(String minimoTela) {
        this.minimoTela = minimoTela;
    }

    public BigDecimal getCosteMetroTela() {
        return costeMetroTela;
    }

    public void setCosteMetroTela(BigDecimal costeMetroTela) {
        this.costeMetroTela = costeMetroTela;
    }

    public BigDecimal getCmt() {
        return cmt;
    }

    public void setCmt(BigDecimal cmt) {
        this.cmt = cmt;
    }

    public String getImagen() {
        return imagen;
    }

    public void setImagen(String imagen) {
        this.imagen = imagen;
    }

    public BigDecimal getConsumoUnitarioTela() {
        return consumoUnitarioTela;
    }

    public void setConsumoUnitarioTela(BigDecimal consumoUnitarioTela) {
        this.consumoUnitarioTela = consumoUnitarioTela;
    }

    public Integer getMinimoPedido() {
        return minimoPedido;
    }

    public void setMinimoPedido(Integer minimoPedido) {
        this.minimoPedido = minimoPedido;
    }

    @XmlTransient
    public List<HistoricoProducto> getHistoricoProductoList() {
        return historicoProductoList;
    }

    public void setHistoricoProductoList(List<HistoricoProducto> historicoProductoList) {
        this.historicoProductoList = historicoProductoList;
    }

    public Usuario getUltimoUsuario() {
        return ultimoUsuario;
    }

    public void setUltimoUsuario(Usuario ultimoUsuario) {
        this.ultimoUsuario = ultimoUsuario;
    }

    public Usuario getUsuarioCreador() {
        return usuarioCreador;
    }

    public void setUsuarioCreador(Usuario usuarioCreador) {
        this.usuarioCreador = usuarioCreador;
    }

    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    public Proveedor getProveedor() {
        return proveedor;
    }

    public void setProveedor(Proveedor proveedor) {
        this.proveedor = proveedor;
    }

    public SerieTallaje getSerieTallaje() {
        return serieTallaje;
    }

    public void setSerieTallaje(SerieTallaje serieTallaje) {
        this.serieTallaje = serieTallaje;
    }

    public S getS() {
        return s;
    }

    public void setS(S s) {
        this.s = s;
    }

    public C getC() {
        return c;
    }

    public void setC(C c) {
        this.c = c;
    }

    public D getD() {
        return d;
    }

    public void setD(D d) {
        this.d = d;
    }

    public EtapaProducto getEtapa() {
        return etapa;
    }

    public void setEtapa(EtapaProducto etapa) {
        this.etapa = etapa;
    }

    public Temporada getTemporada() {
        return temporada;
    }

    public void setTemporada(Temporada temporada) {
        this.temporada = temporada;
    }

    public Proveedor getFabricanteTela() {
        return fabricanteTela;
    }

    public void setFabricanteTela(Proveedor fabricanteTela) {
        this.fabricanteTela = fabricanteTela;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idProducto != null ? idProducto.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Producto)) {
            return false;
        }
        Producto other = (Producto) object;
        if ((this.idProducto == null && other.idProducto != null) || (this.idProducto != null && !this.idProducto.equals(other.idProducto))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Producto[ idProducto=" + idProducto + " ]";
    }

    public BigDecimal getCotizacion() {
        return cotizacion;
    }

    public void setCotizacion(BigDecimal cotizacion) {
        this.cotizacion = cotizacion;
    }
    
    public String getCadenaHistoricoCrear(){
        StringBuilder sb=new StringBuilder();
        sb.append("El Producto ");
        sb.append(this.getDescripcion());
        sb.append(" Color: ");
        sb.append(this.getColor());
         sb.append(" fue creado el ");
        sb.append(this.getUltimaModificacion().toString());
        sb.append(" por el usuario ");
        sb.append(this.getUltimoUsuario().getNombreUsuario());
        return sb.toString();
    }
    
    public String getCadenaHistorico(Producto antiguo){
        StringBuilder sb=new StringBuilder();
        sb.append("El Producto ");
        sb.append(antiguo.getDescripcion());
        sb.append(" fue modificado el ");
        sb.append(this.getUltimaModificacion().toString());
        sb.append(" por el usuario ");
        sb.append(this.getUltimoUsuario().getNombreUsuario());
        sb.append(". Los valores modificados son: ");
        if(!antiguo.getDescripcion().equals(this.descripcion)){
            sb.append("Descripción: ");
            sb.append(this.getDescripcion());
        }
        if(!antiguo.getColor().equals(this.color)){
            sb.append(" Color: ");
            sb.append(this.getColor());
        }
        if(!antiguo.getD().equals(this.d)){
            sb.append(" D: ");
            sb.append(this.getD().getDescripcion());
        }
        if(!antiguo.getC().equals(this.c)){
            sb.append(" C: ");
            sb.append(this.getC().getDescripcion());
        }
        if(!antiguo.getS().equals(this.s)){
            sb.append(" S: ");
            sb.append(this.getS().getDescripcion());
        }
        if(!antiguo.getTemporada().equals(this.temporada)){
            sb.append(" Temporada: ");
            sb.append(this.getTemporada().getDescripcion());
        }
        if(!antiguo.getSerieTallaje().equals(this.serieTallaje)){
            sb.append(" Serie Tallaje: ");
            sb.append(this.getSerieTallaje().getDescripcion());
        }
        if(antiguo.getProveedor()==null && this.getProveedor()!=null){
            sb.append(" Proveedor: ");
            sb.append(this.getProveedor().getNombreComercial());
        }
        if(antiguo.getProveedor()!=null && this.getProveedor()==null){
            sb.append(" Proveedor: ");
            sb.append("No Proveedor");
        }
        if(antiguo.getProveedor()!=null && this.getProveedor()!=null){
            if(!antiguo.getProveedor().equals(this.proveedor)){
                sb.append(" Proveedor: ");
                sb.append(this.getProveedor().getNombreComercial());
            }
        }
        if(!antiguo.getPvp().equals(this.pvp)){
            sb.append(" PVP: ");
            sb.append(this.getPvp());
        }
        if(!antiguo.getCotizacion().equals(this.cotizacion)){
            sb.append(" Cotización: ");
            sb.append(this.getCotizacion());
        }
        return sb.toString();
    }
    
    
    public Producto clone(){
        Producto nuevo=new Producto();
        nuevo.setActivo(this.getActivo());
        nuevo.setC(this.getC());
        nuevo.setCmt(this.getCmt());
        nuevo.setColor(this.getColor());
        nuevo.setComentarios(comentarios);
        nuevo.setConsumoUnitarioTela(consumoUnitarioTela);
        nuevo.setCosteMetroTela(costeMetroTela);
        nuevo.setCotizacion(cotizacion);
        nuevo.setD(d);
        nuevo.setDescripcion(descripcion);
        nuevo.setEtapa(etapa);
        nuevo.setFabricanteTela(fabricanteTela);
        nuevo.setFechaRegistro(fechaRegistro);
        nuevo.setHistoricoProductoList(historicoProductoList);
        nuevo.setIdProducto(idProducto);
        nuevo.setImagen(imagen);
        nuevo.setImagenTela(imagenTela);
        nuevo.setMinimoPedido(minimoPedido);
        nuevo.setNombreComercial(nombreComercial);
        nuevo.setProveedor(proveedor);
        nuevo.setPvp(pvp);
        nuevo.setReferenciaTela(referenciaTela);
        nuevo.setS(s);
        nuevo.setSerieTallaje(serieTallaje);
        nuevo.setSexo(sexo);
        nuevo.setTemporada(temporada);
        nuevo.setUltimaModificacion(ultimaModificacion);
        nuevo.setUltimoUsuario(ultimoUsuario);
        nuevo.setUsuarioCreador(usuarioCreador);
        return nuevo;
    }

    @XmlTransient
    public List<ProductoTalla> getProductoTallaList() {
        return productoTallaList;
    }

    public void setProductoTallaList(List<ProductoTalla> productoTallaList) {
        this.productoTallaList = productoTallaList;
    }

    @XmlTransient
    public List<PvpInternacional> getPvpInternacionalList() {
        return pvpInternacionalList;
    }

    public void setPvpInternacionalList(List<PvpInternacional> pvpInternacionalList) {
        this.pvpInternacionalList = pvpInternacionalList;
    }

    @XmlTransient
    public List<MultiplicadorProductoPedido> getMultiplicadorProductoPedidoList() {
        return multiplicadorProductoPedidoList;
    }

    public void setMultiplicadorProductoPedidoList(List<MultiplicadorProductoPedido> multiplicadorProductoPedidoList) {
        this.multiplicadorProductoPedidoList = multiplicadorProductoPedidoList;
    }

    @XmlTransient
    public List<NivelPrecioProducto> getNivelPrecioProductoList() {
        return nivelPrecioProductoList;
    }

    public void setNivelPrecioProductoList(List<NivelPrecioProducto> nivelPrecioProductoList) {
        this.nivelPrecioProductoList = nivelPrecioProductoList;
    }
}
